
import Tools from "@/CTManage/utils/Tools";
import LogUtils from "@/CTManage/utils/LogUtils";

const ArrayUtils = {

  name: 'ArrayUtils',

  isEmpty(arr) { /* 判断数组是否为空 */
    if(!(arr instanceof Array)) {
      return true;
    }

    return arr.length == 0;
  },

  /* 
    数组转 CSV
    arr 数组
    ch 分隔符
    keys 列，true: 打印属性名，数组['name', 'value']：按此顺序转换
    convent 列属性转换

      convent: 属性值转换，当 keys 为数组时，该值为数组，否则为对象，且没有 prop 属性
      {
        _this: this,
        prop: '属性名',
        formatter: '属性值转换方法，必须在 _this 中'
      }
   */
  toCsv(arr, ch, keys, convent) {

    let _this = this;

    if(Tools.isEmpty(arr)) {
      return '';
    }

    /* LogUtils.debug(arr.length, 'arr.length'); */

    if(Tools.isEmpty(ch)) {
      ch = ',';
    }

    if(Tools.isNull(keys)) {
      keys = true;
    }

    let str = '';

    /* LogUtils.debug(ch, 'ch'); */

    if(arr[0] instanceof Array) {

      str += _this.toCsv(arr[0], ch);
      str += '\r\n';
    } else if(arr[0] instanceof Object) {

      str += _this.toCsv(Tools.getObjValueArr(arr[0], keys, convent), ch);
      str += '\r\n';
    } else {

      let val = arr[0];

      if(!Tools.isNull(convent)) {

        val = Tools.execute(
          Tools.getValue(convent, '_this'),
          Tools.getValue(convent, 'formatter'),
          val
        );
      };

      if(Tools.isNull(val)) {
        val = '';
      }
      str += String(val);
    }

    for(let index = 1; index < arr.length; index++) {

      let e = arr[index];
      if(e instanceof Array) {

        str += _this.toCsv(e);
        str += '\r\n';
      } else if(e instanceof Object) {

        str += _this.toCsv(Tools.getObjValueArr(e, keys, convent), ch);
        str += '\r\n';
      } else {

        let val = e;

        if(!Tools.isNull(convent)) {
          val = Tools.execute(
            Tools.getValue(convent, '_this'),
            Tools.getValue(convent, 'formatter'),
            e
          );
        }

        if(Tools.isNull(val)) {
          val = '';
        }
        str += ch + String(val); 
      }
    }

    return str;
  },

  /* 对象数组是否存在属性 */
  getObjHaveKeyInObjArr(arr, key) {
    let methodName = this.name + '.getObjHaveKeyInObjArr: ';
    let debug = false;

    if(Tools.isEmpty(arr)
      || Tools.isEmpty(key)
      || !(arr instanceof Array)
    ) {
      if(debug) {
        LogUtils.log(methodName + '传值为空');
      }
      return null;
    }

    for(let i = 0; i < arr.length; i++) {
      if(Tools.isExistKey(arr[i], key)) {
        return arr[i];
      }
    }

    return null;
  },

  getObjHaveValueInObjArr(arr, value, key) {
    let methodName = this.name + 'getObjHaveKeyInObjArr: ';
    let debug = false;

    if(debug) {
      LogUtils.log(value, methodName + 'value');
      LogUtils.log(key, methodName + 'key');
    }

    if(Tools.isEmpty(arr)
      || Tools.isEmpty(value)
      || !(arr instanceof Array)
    ) {
      if(debug) {
        LogUtils.log(methodName + 'arr或value为空');
      }
      return null;
    }

    for(let i = 0; i < arr.length; i++) {
      if(Tools.isExistValue(arr[i], value, key)) {
        return arr[i];
      }
    }

    return null;
  },

  getIndexHaveValueInObjArr(arr, value, key) {
    let methodName = this.name + 'getObjHaveKeyInObjArr: ';
    let debug = false;

    if(debug) {
      LogUtils.log(value, methodName + 'value');
      LogUtils.log(key, methodName + 'key');
    }

    if(Tools.isEmpty(arr)
      || Tools.isEmpty(value)
      || !(arr instanceof Array)
    ) {
      if(debug) {
        LogUtils.log(methodName + 'arr或value为空');
      }
      return -1;
    }

    for(let i = 0; i < arr.length; i++) {
      if(Tools.isExistValue(arr[i], value, key)) {
        return i;
      }
    }

    return -1;
  }
}

export default ArrayUtils;
